package cn.edu.ncu.housinghub.constant;

import lombok.Getter;

/**
 * 系统常量枚举类
 */
@Getter
public enum SystemConstant {

    // Redis相关常量
    REDIS_TOKEN_PREFIX_USER("housinghub:user:", "用户登录token前缀"),
    REDIS_TOKEN_PREFIX_ADMIN("housinghub:admin:", "管理员登录token前缀"),
    REDIS_TOKEN_EXPIRE_TIME(30, "用户token过期时间(分钟)"),
    REDIS_ADMIN_TOKEN_EXPIRE_TIME(480, "管理员token过期时间(分钟) - 8小时"),

    // 用户角色相关常量
    ROLE_TENANT(1, "租客角色"),
    ROLE_LANDLORD(2, "房东角色"),
    ROLE_AGENT(4, "中介角色"),
    ROLE_ADMIN(8, "管理员角色"),

    // 房源状态相关常量
    HOUSE_STATUS_PENDING(0, "房源未租状态"),
    HOUSE_STATUS_PUBLISHED(1, "房源已租状态"),
    HOUSE_STATUS_RENTED(2, "房源已下架状态"),

    // 房源出租类型常量
    HOUSE_RENT_TYPE_RENT(1, "房东直租"),
    HOUSE_RENT_TYPE_AGENT(2, "中介代理"),
    // 合同状态相关常量
    CONTRACT_STATUS_PENDING(0, "合同待签署状态"),
    CONTRACT_STATUS_TENANT_SIGNED(1, "租客已签署状态"),
    CONTRACT_STATUS_LANDLORD_SIGNED(2, "房东已签署状态"),
    CONTRACT_STATUS_EFFECTIVE(3, "合同生效状态"),

    // 支付方式相关常量
    PAYMENT_TYPE_MONTHLY(1, "月付"),
    PAYMENT_TYPE_QUARTERLY(2, "季付"),
    PAYMENT_TYPE_ANNUAL(3, "年付"),

    // 维修状态相关常量
    MAINTENANCE_STATUS_PENDING(0, "维修待处理状态"),
    MAINTENANCE_STATUS_PROCESSING(1, "维修处理中状态"),
    MAINTENANCE_STATUS_COMPLETED(2, "维修已完成状态"),

    // 退租状态相关常量
    CHECKOUT_STATUS_PENDING(0, "退租待审核状态"),
    CHECKOUT_STATUS_APPROVED(1, "退租已通过状态"),

    // 房产认证状态相关常量
    PROPERTY_VERIFY_STATUS_REJECTED(2, "房产认证驳回状态"),
    CHECKOUT_STATUS_REJECTED(2, "退租已拒绝状态"),

    PROPERTY_VERIFY_STATUS_PENDING(0, "房产认证待审核状态"),
    PROPERTY_VERIFY_STATUS_APPROVED(1, "房产认证通过状态"),

    // 中介认证状态相关常量
    AGENT_VERIFY_STATUS_REJECTED(0, "中介认证驳回状态"),
    AGENT_VERIFY_STATUS_PENDING(1, "中介认证待审核状态"),
    AGENT_VERIFY_STATUS_APPROVED(2, "中介认证通过状态"),
    // 验证码相关常量
    VERIFICATION_CODE_EXPIRE_TIME(5, "验证码过期时间(分钟)"),
    VERIFICATION_CODE_LENGTH(6, "验证码长度"),
    VERIFICATION_CODE_PREFIX("housinghub:verificationCode:", "验证码前缀"),
    ;


    private final Object value;
    private final String description;

    SystemConstant(Object value, String description) {
        this.value = value;
        this.description = description;
    }

    // 获取字符串类型的值
    public String getStringValue() {
        return (String) value;
    }

    // 获取整数类型的值
    public Integer getIntegerValue() {
        return (Integer) value;
    }
}
